local set = vim.opt
local setlocal = vim.opt_local
local has = vim.fn.has

if has("multi_byte") then
    -- UTF-8 编码 
    set.encoding='utf-8'
    set.termencoding='utf-8'
    set.formatoptions:append('mM')
    set.fileencodings={'ucs-bom','utf-8','gbk','latin1'}
    --[[
    if vim.regex("^\\(zh\\|ja\\|ko\\)"):match_str(vim.v.lang) then
        set.ambiwidth='double'
    end
    ]]
else
    vim.api.nvim_err_writeln("Sorry, this version of nvim(-qt) was not compiled with +multi_byte")
end

-- 使用 Vim 设置，而不是 Vi 设置（好得多）。
-- 这必须是第一位的，因为它会改变其他选项作为副作用。
set.compatible=false

-- 在插入模式下允许所有内容的后退间距
set.backspace={'indent','eol','start'}

set.number=true -- 显示行号
set.relativenumber=true -- 显示相对行号
set.tabstop=4 -- tab大小为4
set.expandtab=true -- 空格代替tab
set.cursorline=true -- 高亮光标所在行
set.cursorcolumn=true -- 高亮光标所在列
set.shiftwidth=4 -- 缩进大小为4
set.softtabstop=4 -- tab对应的空格大小为4
set.backup=false -- 不要保留备份文件
set.undofile=true -- 保留撤消文件（关闭后撤消更改）
set.autochdir=true -- 自动cd到打开文件所在目录
set.showmode=false
set.laststatus=2
set.colorcolumn={'80'}
set.winminwidth=2
set.updatetime=100
set.signcolumn='number'
set.history=50 -- 保留 50 行命令行历史记录
set.ruler=true -- 始终显示光标位置
set.showcmd=true -- 显示不完整的命令
set.incsearch=true -- 执行增量搜索

-- 在许多终端仿真器中，鼠标工作正常，因此启用它
if has("mouse") then
    set.mouse:append('a')
end

-- 打开语法高亮显示，当终端有颜色时也打开高亮显示上次使用的搜索模式
local t_Co = tonumber(vim.o.t_Co)
if (type(t_Co=="number") and t_Co > 2) or has("gui_running") then
    vim.cmd("syntax on")
    set.hlsearch=true
end

-- 只有在支持自动命令的情况下编译时才执行此部分
if has("autocmd") then
    -- 启用文件类型检测。
    -- 使用默认的文件类型设置，以便邮件将 tw 设置为 72，
    -- cindent 在 C 文件中处于打开状态，等等。
    -- 还可以缩进文件，以自动执行与语言相关的缩进。
    vim.cmd("filetype plugin indent on")

    -- 将它们放在一个 autocmd 组中，以便我们可以轻松删除它们
    local augroup = vim.api.nvim_create_augroup('vimrcEx', {clear = true})

    -- 对于所有文本文件，将 textwidth 设置为 78 个字符
    vim.api.nvim_create_autocmd('FileType', {
        pattern='text',
        group=augroup,
        callback=function()
            vim.bo.textwidth=78
        end
    })

    -- 编辑文件时，请始终跳转到最后一个已知的光标位置。
    -- 当位置无效或在事件处理程序中时（在 gvim 上放置文件时发生）时不要这样做。
    -- 当标记在第一行时也不要这样做，这是打开文件时的默认位置。
    vim.api.nvim_create_autocmd('BufReadPost', {
        group=augroup,
        callback=function(opt)
            local line_count = vim.api.nvim_buf_line_count(opt.buf)
            local last_known_line = vim.api.nvim_buf_get_mark(opt.buf, '"')[1]
            if last_known_line > 1 and last_known_line <= line_count then
                vim.api.nvim_feedkeys([[g`"]], 'nx', false)
            end
        end
    })

    augroup = vim.api.nvim_create_augroup('LargeFile', {clear = true})
    local LargeFile=1024*1024*10
    vim.api.nvim_create_autocmd('BufReadPre', {
        group=augroup,
        callback=function(opt)
            local f = opt.file
            if vim.fn.getfsize(f) > LargeFile then
                set.eventignore:append('FileType')
                setlocal.swapfile=false
                setlocal.bufhidden='unload'
                setlocal.buftype='nowrite'
                setlocal.undolevels=-1
            else
                set.eventignore:remove('FileType')
            end
        end
    })
else
    set.autoindent=true -- 始终将自动缩进设置为开启
end

set.background='dark'

-- 插件
local function try_require(libname, callback)
    local suc,lib = pcall(require, libname)
    if suc then
        if callback then
            callback(lib)
        else
            lib.setup{}
        end
    end
end

-- 管理
try_require("paq", function(lib)
    lib:setup {
        clone_args = { "--depth=1", "--recurse-submodules", "--shallow-submodules", "--no-single-branch", "-c", "http.sslVerify=false" }
    } {
        "savq/paq-nvim", -- 管理
        "tanvirtin/monokai.nvim", -- 主题
        "goolord/alpha-nvim", -- 首页
        "folke/neodev.nvim", -- neovim lua 开发
        "neovim/nvim-lspconfig", -- lsp
        { "ms-jpq/coq_nvim", branch = "coq" }, -- 补全
        { "ms-jpq/coq.artifacts", branch = "artifacts" }, -- snippets
        { "ms-jpq/coq.thirdparty", branch = "3p" }, -- shell repl, nvim lua api, scientific calculator, comment banner, etc.
    }
end)

-- 主题
try_require"monokai"

-- 首页
try_require("alpha", function(alpha)
    try_require("alpha.themes.startify", function(startify_theme)
        startify_theme.nvim_web_devicons.enabled = false
        alpha.setup(startify_theme.config)
    end)
end)

-- neovim lua 开发
-- 注：必需在lspconfig导入之前
try_require"neodev"

-- lsp
try_require("lspconfig", function(lib)
    lib.pyright.setup{}
    lib.lua_ls.setup{
        settings = {
            Lua = {
                completion = {
                    callSnippet = "Replace"
                }
            }
        }
    }
end)

-- 补全


-- 通用快捷键
vim.keymap.set('n','<A-h>','<C-w>h')
vim.keymap.set('n','<A-j>','<C-w>j')
vim.keymap.set('n','<A-k>','<C-w>k')
vim.keymap.set('n','<A-l>','<C-w>l')
vim.keymap.set('n','<A-H>','<C-w>H')
vim.keymap.set('n','<A-J>','<C-w>J')
vim.keymap.set('n','<A-K>','<C-w>K')
vim.keymap.set('n','<A-L>','<C-w>L')

vim.keymap.set('i','<A-h>','<C-\\><C-N><C-w>h')
vim.keymap.set('i','<A-j>','<C-\\><C-N><C-w>j')
vim.keymap.set('i','<A-k>','<C-\\><C-N><C-w>k')
vim.keymap.set('i','<A-l>','<C-\\><C-N><C-w>l')
vim.keymap.set('i','<A-H>','<C-\\><C-N><C-w>H')
vim.keymap.set('i','<A-J>','<C-\\><C-N><C-w>J')
vim.keymap.set('i','<A-K>','<C-\\><C-N><C-w>K')
vim.keymap.set('i','<A-L>','<C-\\><C-N><C-w>L')

-- terminal快捷键
vim.keymap.set('t','<A-h>','<C-\\><C-N><C-w>h')
vim.keymap.set('t','<A-j>','<C-\\><C-N><C-w>j')
vim.keymap.set('t','<A-k>','<C-\\><C-N><C-w>k')
vim.keymap.set('t','<A-l>','<C-\\><C-N><C-w>l')
vim.keymap.set('t','<A-H>','<C-\\><C-N><C-w>H')
vim.keymap.set('t','<A-J>','<C-\\><C-N><C-w>J')
vim.keymap.set('t','<A-K>','<C-\\><C-N><C-w>K')
vim.keymap.set('t','<A-L>','<C-\\><C-N><C-w>L')
vim.keymap.set('t','<A-n>','<C-\\><C-n>')

-- 剪切板快捷键
if has('clipboard') then
    vim.keymap.set('n','<A-c>',function()
        vim.fn.setreg('*', vim.fn.expand('<cword>'))
    end)
    vim.keymap.set('n','<A-f>',function()
        vim.fn.setreg('/', vim.fn.expand('<cword>'))
    end)
    vim.keymap.set('v','<A-c>', '"*y')
    vim.keymap.set('v','<A-x>', '"*d')
    vim.keymap.set('n','<A-v>', '"*p')
    vim.keymap.set('i','<A-v>', '<C-R>*')
end

